gsk: Add internal Renderer.create_cairo_surface()
authorEmmanuele Bassi <ebassi@gnome.org>
Mon, 31 Oct 2016 16:26:50 +0000 (16:26 +0000)
committerEmmanuele Bassi <ebassi@gnome.org>
Mon, 31 Oct 2016 16:26:50 +0000 (16:26 +0000)
We need an overridable entry point for GskRenderer to create Cairo
surfaces.

Implementations of GskRenderer can override create_cairo_surface() to
create efficient surfaces, possibly with zero copies involved, depending
on the GDK backend.

gsk/gskrenderer.c
gsk/gskrendererprivate.h

index 2d7cdec4d1886804c3a9ff184bfe4788f76a593e..21236cfc13f01211a3df4f796f1db606d09e87a7 100644 (file)
@@ -115,6 +115,24 @@ gsk_renderer_real_render (GskRenderer *self,
   GSK_RENDERER_WARN_NOT_IMPLEMENTED_METHOD (self, render);
 }
 
+static cairo_surface_t *
+gsk_renderer_real_create_cairo_surface (GskRenderer    *self,
+                                        cairo_format_t  format,
+                                        int             width,
+                                        int             height)
+{
+  GskRendererPrivate *priv = gsk_renderer_get_instance_private (self);
+  int scale_factor = priv->scale_factor > 0 ? priv->scale_factor : 1;
+  int real_width = width * scale_factor;
+  int real_height = height * scale_factor;
+
+  cairo_surface_t *res = cairo_image_surface_create (format, real_width, real_height);
+
+  cairo_surface_set_device_scale (res, scale_factor, scale_factor);
+
+  return res;
+}
+
 static void
 gsk_renderer_dispose (GObject *gobject)
 {
@@ -220,6 +238,7 @@ gsk_renderer_class_init (GskRendererClass *klass)
   klass->realize = gsk_renderer_real_realize;
   klass->unrealize = gsk_renderer_real_unrealize;
   klass->render = gsk_renderer_real_render;
+  klass->create_cairo_surface = gsk_renderer_real_create_cairo_surface;
 
   gobject_class->constructed = gsk_renderer_constructed;
   gobject_class->set_property = gsk_renderer_set_property;
@@ -733,6 +752,18 @@ gsk_renderer_get_for_display (GdkDisplay *display)
   return g_object_new (renderer_type, "display", display, NULL);
 }
 
+cairo_surface_t *
+gsk_renderer_create_cairo_surface (GskRenderer    *renderer,
+                                   cairo_format_t  format,
+                                   int             width,
+                                   int             height)
+{
+  g_return_val_if_fail (GSK_IS_RENDERER (renderer), NULL);
+  g_return_val_if_fail (width > 0 && height > 0, NULL);
+
+  return GSK_RENDERER_GET_CLASS (renderer)->create_cairo_surface (renderer, format, width, height);
+}
+
 static void
 gsk_renderer_set_cairo_context (GskRenderer *renderer,
                                 cairo_t     *cr)
index d702ae5a7835fbd3aeabc1cd8a154bd10a44322b..57f7e861f3fabbb2585ae7ab0a55c12f2c6ed268 100644 (file)
@@ -42,15 +42,24 @@ struct _GskRendererClass
 
   void (* render) (GskRenderer *renderer,
                    GskRenderNode *root);
+
+  cairo_surface_t * (* create_cairo_surface) (GskRenderer *renderer,
+                                              cairo_format_t,
+                                              int width,
+                                              int height);
 };
 
 gboolean gsk_renderer_is_realized (GskRenderer *renderer);
 
-GskRenderNode *         gsk_renderer_get_root_node              (GskRenderer *renderer);
-GdkDrawingContext *     gsk_renderer_get_drawing_context        (GskRenderer *renderer);
-cairo_t *               gsk_renderer_get_cairo_context          (GskRenderer *renderer);
+GskRenderNode *         gsk_renderer_get_root_node              (GskRenderer    *renderer);
+GdkDrawingContext *     gsk_renderer_get_drawing_context        (GskRenderer    *renderer);
+cairo_t *               gsk_renderer_get_cairo_context          (GskRenderer    *renderer);
+cairo_surface_t *       gsk_renderer_create_cairo_surface       (GskRenderer    *renderer,
+                                                                 cairo_format_t  format,
+                                                                 int             width,
+                                                                 int             height);
 
-GskProfiler *           gsk_renderer_get_profiler               (GskRenderer *renderer);
+GskProfiler *           gsk_renderer_get_profiler               (GskRenderer    *renderer);
 
 G_END_DECLS